// 引入内置模块（流读取，适合大文件）
const http = require('http');
const fs = require('fs');
const path = require('path');

// 1. 确定目标文件（同前序程序）
const targetFile = process.argv[2] ? path.resolve(__dirname, process.argv[2]) : __filename;

// 2. 创建HTTP服务
const server = http.createServer((req, res) => {
  if (req.url === '/' && req.method === 'GET') {
    res.setHeader('Content-Type', 'text/plain; charset=utf-8');

    // 3. 创建可读流（自动分块读取，无需手动管理缓冲区）
    const readStream = fs.createReadStream(targetFile, 'utf8');

    // 流事件监听：读取成功
    readStream.on('open', () => {
      console.log(`📥 开始流读取：${targetFile}`);
      // 管道连接：流 → 响应（自动处理背压，避免内存溢出）
      readStream.pipe(res);
    });

    // 流事件监听：读取错误（如文件不存在）
    readStream.on('error', (err) => {
      res.statusCode = 404;
      res.end(`❌ 流读取错误：${err.message}\n（流优势：分块传输，低内存占用）`);
    });

    // 流事件监听：读取完成
    readStream.on('end', () => {
      console.log(`📤 流读取完成`);
      // 无需手动end，pipe会自动调用res.end()
    });
  } else {
    res.statusCode = 404;
    res.end('❌ 页面未找到，请访问：http://localhost:8081');
  }
});

// 4. 启动服务 + 补充流与普通读取的区别说明
server.listen(8081, () => {
  console.log(`🚀 流读取服务启动！`);
  console.log(`📂 目标文件：${targetFile}`);
  console.log(`🌐 访问地址：http://localhost:8081`);
  console.log(`💡 流 vs 普通读取：`);
  console.log(`  - 流：分块读取，低内存（适合大文件），自动背压`);
  console.log(`  - 普通读取（readFile）：一次性加载，高内存（适合小文件）`);
});